package com.shop.valueobjects;

import java.io.Serializable;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import com.shop.exceptions.MassenArtikelAnzahlException;

/**
 * @description Klasse Warenkorb - enthaelt die Werte des Warenkorbs mit getter und setter
 */
public class Warenkorb implements Serializable {

	
	private static final long serialVersionUID = -9198575105132720166L;


	// Number = Anzahl der Artikel im Warenkorb
	private Map<Artikel, Number> warenkorb = new HashMap<Artikel, Number>();
	
	/**
	 * @return the warenkorb
	 */
	public Map<Artikel, Number> getWarenkorb() {
		return warenkorb;
	}

	/**
	 * @param warenkorb the warenkorb to set
	 */
	public void setWarenkorb(Map<Artikel, Number> warenkorb) {
		this.warenkorb = warenkorb;
	}

	/**
	 * @description Adds an article to the cart, if the article exists, 
	 * @description the count will be increment
	 * @param a Article Object
	 * @param count of Articles
	 * @throws MassenArtikelAnzahlException 
	 */
	public void addArtikel(Artikel a, int count) throws MassenArtikelAnzahlException {
		if(a instanceof MassenArtikel) {
			MassenArtikel mA = (MassenArtikel) a;
			System.out.println((count  % mA.getAnzahl())+"");
			if((count  % mA.getAnzahl()) > 0) {
				throw new MassenArtikelAnzahlException(mA);
			}
		}
				
		this.warenkorb.put(a, count);
		 
//		if(this.warenkorb.containsKey(a)) {
//			this.warenkorb.put(a, count);
//		} else {
//			int x = this.warenkorb.get(a).intValue() + 1;
//			this.removeArtikel(a);
//			this.warenkorb.put(a, x);
//		}
	}
	
	/**
	 * @description removes an article from cart if these exists
	 * @param a article object
	 */
	public void removeArtikel(Artikel a) {
		Iterator iterator = this.warenkorb.entrySet().iterator();
		while (iterator.hasNext()) {
			Map.Entry<Artikel, Number> pair = (Map.Entry<Artikel, Number>) iterator.next();
			if(pair.getKey().getNr() == a.getNr()) {
				iterator.remove();
			}
		}
	}
	
	/**
	 * @description get all article as map
	 * @return
	 */
	public Map<Artikel, Number> getAllArtikel() {
		return this.warenkorb;
	}
	
	/**
	 * creates an 'rechnungs' object
	 * @param k Kunde
	 * @return r Rechung object
	 */
	public Rechnung buy(Kunde k) {
		Rechnung r = new Rechnung();
		r.setDate(new Date());
		r.setArticleList(this.warenkorb);
		r.setKunde(k);
		return r;
	}
	// Warenkorb leeren
	public void complete() {
		this.warenkorb.clear();
	}
}
